#pragma once

#include "logger_api.hpp"
#include "utils/thread_pool.hpp"
#include "utils/curl_resource.hpp"
#include "utils/curl_global.hpp"
#include <string>
#include <mutex>


// 网络输出器实现
class NetworkSink : public ISink {
public:
    // 构造函数：需要URL、线程池大小、超时参数
    NetworkSink(const std::string& url, 
                size_t thread_pool_size = 4,
                long timeout = LoggerConstants::DEFAULT_NETWORK_TIMEOUT,
                long connect_timeout = LoggerConstants::DEFAULT_CONNECT_TIMEOUT);
    ~NetworkSink() override = default; // 无需手动清理，RAII类会自动释放
    void log(LogLevel level, const std::string& formatted_message) override;

    std::string getName() override {
        // 格式：类型 + [URL] + [线程池大小]，确保不同URL/线程池实例唯一
        return "network_sink[" + m_url + "][" + std::to_string(m_threadPoolSize) + "_threads]";
    }

private:
    ThreadPool m_thread_pool; // 异步处理任务的线程池
    size_t m_threadPoolSize;  // 线程池大小

    std::string m_url;
    CurlHandle m_curHandle; // RAII句柄
    CurlSlist m_headers;  // RAII头信息
    std::mutex m_curlMutex; // 保护curl句柄
    long m_timeout;  // 超时时间（秒）
    long m_connect_timeout; // 连接超时时间（秒）
    
    static CurlGlobalManager m_curl_manager;

    bool configureCurl(); // 配置函数（返回成功/失败）
    // Libcurl 的回调函数，用于处理接收的响应数据
    static size_t write_callback(void* contexts, size_t size, size_t nmemb, void* userp);
};
